perm filename TBOX.FAI[CMS,LCS]3 blob sn#347580 filedate 1978-04-13 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00005 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00002 00002		TITLE TBOX
C00005 00003	INPUT WAIT
C00007 00004	Update LEDs
C00008 00005	 Bit spreading table
C00010 ENDMK
C⊗;
	TITLE TBOX
	.INSERT MAC748.FAI[CMS,LCS]

	CMD ← 1 ↔ N ← 2	↔ T ← 3
	SW0 ← 4	↔ SW1 ← 5 ↔ SW2 ← 6 ↔ AD ← 7

	XTAL ← =5000000
	BRATE ← =9600	;Baud rate

	TBIT ← ((=10000000/BRATE)/((=10000000/XTAL)*=15))/2

	LDEF ← 7
	ROW0 ← 357 ↔ ROW1 ← 337
	SBITS ← 60

		JMP	RST	;RESET VECTOR
		0
		DISXI		;EXTERNAL INTERRUPT VECTOR
		NOP
		NOP
		NOP
	ERROR:	DISTI		;TIMER INT VECTOR
		RETR

	RST:	MOVI	377	;SETUP INPUT PORTS
		OUTB
		OUTP	1
		OUTP	2

		MOVI	LDEF	;SETUP LED DEFAULT
		CALL	OLED
		CLRA		;Setup timer
		MOVAT
		STRTT

		JMP	SETFLG

; Set scan flag and timer
	UPFLG:	DJNZ	T,CKIN
	SETFLG:	MOVRI	T,4	;4 = 96 ms
		CLRF0		;Set scan flag
		CPLF0
;INPUT WAIT
   OFFSET ← TBIT/2
	CLRIT:	CLRA		;Zero input byte
	INWAI:	JTF	UPFLG	;CHECK IF TIMER TIME OUT

	CKIN:	JT0H	INWAI	;CHECK FOR START BIT

		MOVRI	N,OFFSET-4
	CENTER:	DJNZ	N,CENTER	;Wait for center of bit
		JT0H	INWAI		;Check if valid start bit

		MOVRI	CMD,11	;# of bits -1
	ILOOP:	CALL	IWAI
		DJNZ	CMD,ILOOP

		ROLC		;Shift out stop bit
		JCC	CLRIT	;Check for good stop bit.

		CALL	OLED	;Update leds

		JF0S	SCAN	;Check if time to scan.
; Output switches
	OSWTCH:	MOVRA	SW0
		CALL	OBYTE
		MOVRA	SW1
		CALL	OBYTE
		MOVRA	SW2
		CALL	OBYTE
		MOVRA	AD
		CALL	OBYTE
		JMP	CLRIT

	IWAI:	MOVRI	N,TBIT-6
	WAI:	DJNZ	N,WAI
		CLRC
		JT0H	BITON
		NOP
		RORC
		RET

	BITON:	CPLC
		RORC
		RET
;Update LEDs
	OLED:	ANI	357
		RORC		;Get cal led
		MOVAR	CMD	;Save mode

		MOVI	377
	CLRL:	OUTB		;Clear led loop
		DECA
		JBS	3,CLRL

		JCC	OMODE	;Set cal?
		MOVI	367
		OUTB

	OMODE:	MOVRA	CMD
		OUTB		;Write mode led.
		RET

; Output Acc. to SI/O line
	OBYTE:	MOVRI	CMD,11	;# of bits -1
		CLRC
		ROLC		;Start bit
	OLOOP:	OUTP	1	;Output bit
		RORC
		MOVRI	N,TBIT-3

	OWAIT:	DJNZ	N,OWAIT
		DJNZ	CMD,OLOOP
		
		ORPI	1,377	;Stop bit

		MOVRI	N,TBIT-7
	SWAIT:	DJNZ	N,SWAIT
		NOP
		RET
; Bit spreading table
	LOC 474
		  0 ↔   1 ↔   4 ↔   5 ↔  20 ↔  21 ↔  24 ↔  25
		100 ↔ 101 ↔ 104 ↔ 105 ↔ 120 ↔ 121 ↔ 124 ↔ 125

	SCAN:	CLRF0		;Reset scan flag
		ORBI	SBITS	;Turn off rows
		ANBI	ROW0
		INP	1	;Scan row 0
		CPLA
		MOVAR	SW0	;Save it
		ANI	17	;Get low nibble
		MOVPA		;Get bits from spread table
		XCHR	SW0
		SWAP		;Swap high low nibbles
		ANI	17	;Get high nibble 
		MOVPA
		MOVAR	SW1

		ORBI	SBITS
		ANBI	ROW1
		INP	1	;Scan row 1
		CPLA

		ANI	17	;Low nibble
		MOVPA
		ROL		;Shift + bits
		ORR	SW0	;Or into - bits
		ANI	374	;Clear teach and off bits.
		MOVAR	SW0
		INP	1	;Scan row 1 again
		CPLA
		SWAP
		ANI	17
		MOVPA
		ROL
		ORR	SW1
		MOVAR	SW1
		INP	2	;Get push buttons
		CPLA
		MOVAR	SW2
		ROLC		;Shift & swap teach & off bits
		ROL
		ROLC
		ANI	3
		ORR	SW0
		MOVAR	SW0

		CLRA
		JT1H	ADZRO
		INB
		JNZ	ADZRO	;Force AD to be non zero
		INCA
	ADZRO:	MOVAR	AD
		JMP	OSWTCH
   LOC 2272
		0	;This is for a block of zeros
END